package com.geezdata.cps.base.utils;

import java.lang.reflect.Field;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class EmojiUtil {
	private static final Logger logger = LoggerFactory.getLogger(EmojiUtil.class);
	
	/**
	 * 检测是否有emoji字符
	 * @param source
	 * @return 一旦含有就抛出
	 */
	public static boolean containsEmoji(String source) {
	    if (StringUtils.isBlank(source)) {
	        return false;
	    }

	    int len = source.length();

	    for (int i = 0; i < len; i++) {
	        char codePoint = source.charAt(i);

	        if (isEmojiCharacter(codePoint)) {
	            //do nothing，判断到了这里表明，确认有表情字符
	            return true;
	        }
	    }

	    return false;
	}

	private static boolean isEmojiCharacter(char codePoint) {
	    return (codePoint == 0x0) ||
	            (codePoint == 0x9) ||
	            (codePoint == 0xA) ||
	            (codePoint == 0xD) ||
	            ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||
	            ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) ||
	            ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
	}

	/**
	 * 过滤emoji 或者 其他非文字类型的字符
	 * @param source
	 * @return
	 */
	public static String filterEmoji(String source) {

	    if (!containsEmoji(source)) {
	        return source;//如果不包含，直接返回
	    }
	    //到这里铁定包含
	    StringBuilder buf = null;

	    int len = source.length();

	    for (int i = 0; i < len; i++) {
	        char codePoint = source.charAt(i);

	        if (isEmojiCharacter(codePoint)) {
	            if (buf == null) {
	                buf = new StringBuilder(source.length());
	            }

	            buf.append(codePoint);
	        } else {
	        }
	    }

	    if (buf == null) {
	        return source;//如果没有找到 emoji表情，则返回源字符串
	    } else {
	        if (buf.length() == len) {//这里的意义在于尽可能少的toString，因为会重新生成字符串
	            buf = null;
	            return source;
	        } else {
	            return buf.toString();
	        }
	    }

	}
	
	/**
	 * 替换订单
	 * @param emoji
	 * @return
	 */
	public static String replaceEmoji(String emoji){
		if(emoji == null) {
			return null;
		}
		emoji = emoji.replaceAll("[^\\u0000-\\uFFFF]", "?");
		return emoji;    
	}

	public static void replaceEmojiInObject(Object o){
		// 获取对象obj的所有属性域
		Field[] fields = o.getClass().getDeclaredFields();
		for (Field f : fields) {
			f.setAccessible(true);
			if(f.getType().getName().equals("java.lang.String")){
				try {
					f.set(o,filterEmoji((String) f.get(o)));
				} catch (IllegalAccessException e) {
					logger.error(e.getMessage());
				}
			}else if(f.getType().getName().equals("java.util.List")){
				try {
					if(f.get(o) != null) {
						for (Object o1 : (List<?>) f.get(o)) {
							replaceEmojiInObject(o1);
						}
					}
				} catch (IllegalAccessException e) {
					logger.error(e.getMessage());
				}
			}
		}
	}
}
